package com.shanhy.plugin.license;

import com.formdev.flatlaf.FlatLightLaf;
import com.toedter.calendar.JDateChooser;

import javax.swing.*;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Date;

/**
 * LicenseGeneratorGUI
 *
 * @author 单红宇
 * @date 2024-04-11 16:32:31
 */
public class LicenseGeneratorGUI extends JFrame {

    /**
     * 注册码
     */
    private final JTextField regCodeField;
    /**
     * 有效期
     */
    private final JDateChooser dateChooser;
    /**
     * 授权码
     */
    private final JTextArea licenseCodeArea;

    /**
     * 入口
     *
     * @param args args
     */
    public static void main(String[] args) {
        // 由于编译Native Image的特殊性，我们需要在Swing程序的main方法入口最开始处强制设置一个环境变量，否则在完成后面的编译后，运行会失败
        // 注意：这个 java.home 设置的详细解释如下：
        // 因为我们使用graalvm打包后的程序是需要支持拷贝到任意没有安装jdk的电脑都可以运行的，所以我们要将java.home设置为当前程序的目录
        // 如果你打包后的程序肯定运行在一个安装了jdk的电脑上，则这句话可以不设置
        // 开发时，电脑肯定安装了jdk，所以要去掉设置，况且当前目录也没有java运行环境（native打包后运行环境的dll会被拷贝到当前目录，也就是当前目录就有运行环境了）
        String classPath = System.getProperty("java.class.path");
        // 使用exe方式运行时，是没有classpath的，我这里基于这个判断来决定是否设置java.home，这是一个比较取巧的方法
        if(classPath == null || classPath.isBlank()) {
            System.setProperty("java.home", ".");
        }
        FlatLightLaf.setup();
        SwingUtilities.invokeLater(LicenseGeneratorGUI::new);
    }

    /**
     * LicenseGeneratorGUI
     */
    public LicenseGeneratorGUI() {
        setTitle("QuickCode-Plugin License Generator");
        JPanel contentPanel = new JPanel();
        // 设置内容面板的内边距
        contentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 上下左右内边距均为10像素

        // 使用GridBagLayout布局管理器以便更精细地控制布局
        contentPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5); // 上下左右内边距分别为0、0、10、0
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.LINE_END; // 控件右对齐

        // 第一行：注册码
        JLabel regCodeLabel = new JLabel("注册码：", SwingConstants.RIGHT);
        regCodeField = new JTextField(20);
        gbc.gridx = 1;
        gbc.gridy = 1;
        contentPanel.add(regCodeLabel, gbc);
        gbc.gridx = 2;
        gbc.gridy = 1;
        contentPanel.add(regCodeField, gbc);

        // 第二行：日期
        JLabel dateLabel = new JLabel("有效期：", SwingConstants.RIGHT);
        dateChooser = new JDateChooser();
        gbc.gridx = 1;
        gbc.gridy = 2;
        contentPanel.add(dateLabel, gbc);
        gbc.gridx = 2;
        gbc.gridy = 2;
        contentPanel.add(dateChooser, gbc);

        // 第三行：授权码（多行文本域）
        JLabel authCodeLabel = new JLabel("授权码：", SwingConstants.RIGHT);
        licenseCodeArea = new JTextArea(10, 30);
        licenseCodeArea.setEditable(false);
        licenseCodeArea.setLineWrap(true);
        // 添加类似JTextField的边框
        licenseCodeArea.setBorder(new CompoundBorder(UIManager.getLookAndFeelDefaults().getBorder("TextField.border"),
                new EmptyBorder(2, 5, 2, 5)));

        JScrollPane scrollPane = new JScrollPane(licenseCodeArea,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setBorder(BorderFactory.createEmptyBorder());
        gbc.gridx = 1;
        gbc.gridy = 3;
        gbc.fill = GridBagConstraints.VERTICAL;
        authCodeLabel.setVerticalAlignment(SwingConstants.TOP);
        contentPanel.add(authCodeLabel, gbc);
        gbc.gridx = 2;
        gbc.gridy = 3;
        contentPanel.add(scrollPane, gbc);

        // 第四行：按钮
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        JButton generateButton = new JButton("生成授权码");
        JButton exitButton = new JButton("退出");

        exitButton.addActionListener(e -> System.exit(0));
        generateButton.addActionListener(this::onOk);

        buttonPanel.add(generateButton);
        buttonPanel.add(exitButton);

        gbc.gridwidth = 2; // 按钮占据两列
        gbc.anchor = GridBagConstraints.CENTER; // 按钮居中对齐
        gbc.gridx = 1;
        gbc.gridy = 4;
        contentPanel.add(buttonPanel, gbc);

        // 将内容面板设置为JFrame的内容面板
        setContentPane(contentPanel);
        // 设置窗口不可调整大小
        this.setResizable(false);
        // 显示窗口
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * 生成授权码事件
     *
     * @param e e
     */
    private void onOk(ActionEvent e) {
        // 在这里实现生成授权码的功能，并将生成的授权码填入licenseCodeField
        String enteredRegistrationCode = regCodeField.getText();
        Date selectedDate = dateChooser.getDate();

        if (enteredRegistrationCode.isEmpty() || selectedDate == null) {
            licenseCodeArea.setText("");
        } else {
            // 假设generateLicense是一个自定义的方法来生成授权码
            String generatedLicenseCode = "generateLicense...";
            licenseCodeArea.setText(generatedLicenseCode);
        }
    }

}